//
//  DataBaseViewModel.swift
//  新浪微博项目
//
//  Created by 王炯 on 16/8/2.
//  Copyright © 2016年 王炯. All rights reserved.
//

import UIKit

// 微博首页数据处理层
//1-检查本地是否有数据
/*
 01 - 查询数据 -> 返回数据
 - 如果查询本地有数据  直接返回
 - 如果查询本地没有数据
 - 网络请求数据
 - 保存数据
 */
//2-查询本地数据库的首页微博信息
//3-保存微博信息
//4-删除本地微博信息
class DataBaseViewModel: NSObject
{

    
    
    
    //1-检查本地是否有数据
    //使用类方法(工具方法)
    //传入参数sinceID:当下拉刷新时使用,maxID:当上拉刷新时使用,
    //回调的返回信息:response:返回有没有字典数据信息
    class func CheckCache(sinceId: Int64, maxId: Int64, callback:(response:[[String: AnyObject]]?)->())
    {
        //1-返回本地查询的结果
        let result = GetLocalCache(sinceId, maxId: maxId)
        
        //2-判断本地有没有数据
        if result?.count > 0
        {
            //print("本地有数据")
            
            //返回本地的数据
            callback(response: result)
        }
        else
        {
            //print("本地没有数据，需要从网络获取数据")
            
            //网络获取数据
             WeiBoNetWorkTool.sharedTools.GETHomeData(sinceId, maxId: maxId,model: AuthViewModel.AuthViewModelTools.userModel!, success: { (response) in
                
                
                
                //强制将result转换成字典
                guard let r = response as? [String:AnyObject] else
                {
                    
                    callback(response: nil)
                    
                    return
                }
                
                //r取r的r["statuses"]值(值为字典的数组)
                guard let statuseArray = r["statuses"] as? [[String: AnyObject]] else
                {
                   callback(response: nil)
                    
                    return
                }
                
                //(1)请求数据成功,返回字典数组
                callback(response: statuseArray)
                
                //(2)保存网络数据到本地
                SaveLocaleCache(statuseArray)
                
                
                }){ (error) in
                    
                    
                    print("网络请求数据失败")
                    
                    callback(response: nil)
                    
                    //告知VC网络数据请求失败,传递数据为0
                    //isSuccess(isSucc: false,count: 0)
                 }
        }
        
    }
    
    
    
    
    //2-传入一些参数来查询本地数据库的首页微博信息   
    //传入参数sinceID:当下拉刷新时使用,maxID:当上拉刷新时使用,
    //回调的返回信息:response:返回有没有字典数据信息
    class func GetLocalCache(sinceId: Int64, maxId: Int64) -> [[String: AnyObject]]?
    {
        
        //(1)判断用户有没有登录
        guard let userId = AuthViewModel.AuthViewModelTools.userModel?.uid else
        {
            print("用户没有登录,不能查询本地数据")
            return nil
        }
        
        //(2)如果是第一次，则需要从网络获取数据
        //？？？？？仔细想想，逻辑上有问题
        if sinceId <= 0 && maxId <= 0
        {
            return nil
        }
        
        
        //(3)从本地查询数据
        //3-1 定义查询语句
        var sql = ""
        sql += "SELECT * FROM T_HomeData\n"
        //需要查询的userid==当前的用户id
        sql += "WHERE userid=\(userId)\n"
        
        
        //仔细想想：下拉之后无法从本地获取数据????
        if sinceId > 0 {
            sql += "AND statusid>\(sinceId)\n"
        }

        
        
        //上拉刷新时,maxId > 0，此时获取当次20条微博之前的微博数据(微博ID与时间成正向比例),故获取微博ID小于maxId的数据库信息
        if maxId > 0 {
            sql += "AND statusid<=\(maxId)\n"
        }
        //按照微博ID(时间)降序排列
        sql += "ORDER BY statusid DESC\n"
        //最多查询20条数据
        sql += "LIMIT 20"
        
        //3-2 根据查询语句得到查询结果
        let result = SQLManager.sharedTools.SelectedRecord(sql)
        
        //3-3 创建一个临时可变数组
        var tempArray:[[String: AnyObject]] = [[String: AnyObject]]()
        
        
        //3-4 遍历查询到的字典数组，并取出每一个字典中的status值(微博数据)
        for SqDict in result
        {
            
            print("从本地获取数组有值")
            
            
            //将字典中的status值由NSData类型反序列化成字典(微博数据字典)
            let dict = try! NSJSONSerialization.JSONObjectWithData(SqDict["status"] as! NSData, options: []) as! [String: AnyObject]
            
            //保存字典
            tempArray.append(dict)
        }
        
        //返回字典
        return tempArray
        
    }
    
    
    //3 保存当前的首页数据到数据库里
    class func SaveLocaleCache(dataArray:[[String: AnyObject]])
    {
        //1-判断用户有没有登录
        guard let userId = AuthViewModel.AuthViewModelTools.userModel?.uid else
        {
            print("用户没有登录,不能查询本地数据")
            return
        }
        
        //2-定义Inset语句
        //使用(?,?,?)做占位符
        //插入数据或取代数据
        let sql = "INSERT OR REPLACE INTO T_HomeData (statusid,userid,status) VALUES (?,?,?)"
        
        //3-执行sql语句
        // 执行sql
        SQLManager.sharedTools.queue.inDatabase { (db) -> Void in
            
            
            //遍历dataArray字典数组
            for dict in dataArray
            {
                
                //(1)取微博的ID
                let statuId = dict["id"] as! NSNumber
                
                //(2)userID
                
                //(3)微博数据(字典序列化成NSData)
                let model = try! NSJSONSerialization.dataWithJSONObject(dict, options: [])
                
                
                
                let result = db.executeUpdate(sql, withArgumentsInArray: [statuId,userId,model])
                
                
                if result
                {
                    //print("添加数据成功")
                }
                else
                {
                    //print("添加数据失败")
                }
            }
            
        }
    }
    
    
    //4 删除(清空)本地数据
    //删除一段时间的数据
    class func ClearLocaleCache()
    {
        
        
        //2-定义Insert语句
        
        //2-1 获取当前时间的前6分钟
        //当前时间
        let date = NSDate()
        
        //当前时间的前6分钟时间
        let formerTime = date.dateByAddingTimeInterval(-6*60)
        
        //声明时间格式与数据库中保存的时间格式一致
        let df = NSDateFormatter()
        
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        
        //利用df重新设置date
        let formerDateStr = df.stringFromDate(formerTime)
        
        
        
        
        //2-2 定义insert语句，清理6分钟前的数据库数据
        //使用(?,?,?)做占位符
        //插入数据或取代数据
        let sql = "DELETE FROM T_HomeData WHERE createtime <'\(formerDateStr)'"
        
        
        
        
        
        //3-执行sql语句
        SQLManager.sharedTools.queue.inDatabase { (db) in
            
            
            let result = db.executeUpdate(sql, withArgumentsInArray: nil)
            
            if result
            {
                print("删除数据成功")
            }
            else
            {
                print("删除数据失败")
            }            
            
        }

    
      }
    
    
}
